package com.tanhan.mindapp.utils;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.tanhan.mindapp.dao.BaseEntity;

/**
 * 通用分页工具类
 */
public class PageUtils {

    /**
     * 通用分页方法 - 支持实体对象作为分页参数
     *
     * @param service      MyBatis-Plus服务接口
     * @param entity       查询条件实体
     * @param queryWrapper 查询条件构造器
     * @param <T>          实体类型
     * @return 分页结果
     */
    public static <T extends BaseEntity> IPage<T> pageQuery(IService<T> service, T entity, QueryWrapper<T> queryWrapper) {
        // 创建分页对象
        Page<T> page = new Page<>(entity.getPageNum(), entity.getPageSize());
        // 处理排序
        handleSorting(queryWrapper, entity);
        // 执行分页查询
        return service.page(page, queryWrapper);
    }

    /**
     * 通用分页方法 - 支持DTO对象作为分页参数
     *
     * @param service      MyBatis-Plus服务接口
     * @param dto          查询条件DTO
     * @param queryWrapper 查询条件构造器
     * @param <T>          实体类型
     * @param <D>          DTO类型
     * @return 分页结果
     */
    public static <T, D> IPage<T> pageQuery(IService<T> service, D dto, QueryWrapper<T> queryWrapper) {
        // 通过反射获取分页参数
        try {
            Integer pageNum = (Integer) dto.getClass().getMethod("getPageNum").invoke(dto);
            Integer pageSize = (Integer) dto.getClass().getMethod("getPageSize").invoke(dto);

            // 创建分页对象
            Page<T> page = new Page<>(pageNum != null ? pageNum : 1, pageSize != null ? pageSize : 10);
            // 处理排序（如果DTO中有排序字段）
            // handleSortingForDTO(queryWrapper, dto);
            // 默认按创建时间降序排列
            queryWrapper.orderByDesc("create_time");
            // 执行分页查询
            return service.page(page, queryWrapper);
        } catch (Exception e) {
            // 如果无法通过反射获取分页参数，使用默认值
            Page<T> page = new Page<>(1, 10);
            queryWrapper.orderByDesc("create_time");
            return service.page(page, queryWrapper);
        }
    }

    /**
     * 处理排序
     */
    private static <T extends BaseEntity> void handleSorting(QueryWrapper<T> queryWrapper, T entity) {
        if (entity.getOrderByColumn() != null && !entity.getOrderByColumn().isEmpty()) {
            String columnName = camelToUnderline(entity.getOrderByColumn());
            if ("asc".equals(entity.getIsAsc())) {
                queryWrapper.orderByAsc(columnName);
            } else {
                queryWrapper.orderByDesc(columnName);
            }
        } else {
            // 默认按create_time降序排列
            queryWrapper.orderByDesc("create_time");
        }
    }

    /**
     * 驼峰转下划线
     */
    private static String camelToUnderline(String camelCase) {
        StringBuilder result = new StringBuilder();
        for (int i = 0; i < camelCase.length(); i++) {
            char c = camelCase.charAt(i);
            if (Character.isUpperCase(c)) {
                if (i > 0) {
                    result.append("_");
                }
                result.append(Character.toLowerCase(c));
            } else {
                result.append(c);
            }
        }
        return result.toString();
    }
}
